Micron Document
NexusPi Git Node


Displaying Raw • Download

lib/microReticulum/src/Type.h copilot/add-rtnode-configuration-options (9529fa8a) Text, 20.46 KB

Tff7b72#Tff7b72pragma once

Tff7b72#Tff7b72include T8b949e"Log.h"

Tff7b72#Tff7b72include T8b949e<stdint.h>
Tff7b72#Tff7b72include T8b949e<math.h>


Te6edf3namespace Te6edf3RNS Tb4b4b4{ Te6edf3namespace Te6edf3Type Tb4b4b4{

T8b949e// generic empty object constructor type
Tff7b72enum Te6edf3NoneConstructor Tb4b4b4{
Te6edf3NONE
Tb4b4b4}Tb4b4b4;

Te6edf3namespace Te6edf3Persistence Tb4b4b4{
T8b949e//static const uint16_t DOCUMENT_MAXSIZE = 1024;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3DOCUMENT_MAXSIZE Tff7b72= T79c0ff8192Tb4b4b4;
T8b949e//static const uint16_t DOCUMENT_MAXSIZE = 16384;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3BUFFER_MAXSIZE Tff7b72= Te6edf3PersistenceTff7b72:Tff7b72:Te6edf3DOCUMENT_MAXSIZE Tff7b72* T79c0ff1.5Tb4b4b4; T8b949e// Json write buffer of 1.5 times document seems to be sufficient
Tb4b4b4}

Te6edf3namespace Te6edf3Cryptography Tb4b4b4{
Te6edf3namespace Te6edf3Fernet Tb4b4b4{
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3FERNET_OVERHEAD Tff7b72= T79c0ff48Tb4b4b4; T8b949e// Bytes
Tb4b4b4}
Te6edf3namespace Te6edf3Token Tb4b4b4{
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3TOKEN_OVERHEAD Tff7b72= T79c0ff48Tb4b4b4; T8b949e// Bytes
Tff7b72enum Te6edf3token_mode Tb4b4b4{
Te6edf3MODE_AES Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3MODE_AES_128_CBC Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3MODE_AES_256_CBC Tff7b72= T79c0ff0x03Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3namespace Te6edf3Reticulum Tb4b4b4{

T8b949e/*
The MTU that Reticulum adheres to, and will expect other peers to
adhere to. By default, the MTU is 507 bytes. In custom RNS network
implementations, it is possible to change this value, but doing so will
completely break compatibility with all other RNS networks. An identical
MTU is a prerequisite for peers to communicate in the same network.

Unless you really know what you are doing, the MTU should be left at
the default value.

Future minimum will probably be locked in at 251 bytes to support
networks with segments of different MTUs. Absolute minimum is 219.
*/
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3MTU Tff7b72= T79c0ff500Tb4b4b4;

T8b949e/*
Whether automatic link MTU discovery is enabled by default in this
release. Link MTU discovery significantly increases throughput over
fast links, but requires all intermediary hops to also support it.
Support for this feature was added in RNS version 0.9.0. This option
will become enabled by default in the near future. Please update your
RNS instances.
*/
Tff7b72static Tff7b72const Tffa657bool Te6edf3LINK_MTU_DISCOVERY Tff7b72= Tffa657trueTb4b4b4;

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3MAX_QUEUED_ANNOUNCES Tff7b72= T79c0ff16384Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3QUEUED_ANNOUNCE_LIFE Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24Tb4b4b4;

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3ANNOUNCE_CAP Tff7b72= T79c0ff2Tb4b4b4;
T8b949e/*
The maximum percentage of interface bandwidth that, at any given time,
may be used to propagate announces. If an announce was scheduled for
broadcasting on an interface, but doing so would exceed the allowed
bandwidth allocation, the announce will be queued for transmission
when there is bandwidth available.

Reticulum will always prioritise propagating announces with fewer
hops, ensuring that distant, large networks with many peers on fast
links don't overwhelm the capacity of smaller networks on slower
mediums. If an announce remains queued for an extended amount of time,
it will eventually be dropped.

This value will be applied by default to all created interfaces,
but it can be configured individually on a per-interface basis.
*/

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3MINIMUM_BITRATE Tff7b72= T79c0ff500Tb4b4b4;

T8b949e// TODO: To reach the 300bps level without unreasonably impacting
T8b949e// performance on faster links, we need a mechanism for setting
T8b949e// this value more intelligently. One option could be inferring it
T8b949e// from interface speed, but a better general approach would most
T8b949e// probably be to let Reticulum somehow continously build a map of
T8b949e// per-hop latencies and use this map for the timeout calculation.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3DEFAULT_PER_HOP_TIMEOUT Tff7b72= T79c0ff6Tb4b4b4;

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3HASHLENGTH Tff7b72= T79c0ff256Tb4b4b4; T8b949e// In bits
T8b949e// Length of truncated hashes in bits.
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3TRUNCATED_HASHLENGTH Tff7b72= T79c0ff128Tb4b4b4; T8b949e// In bits

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3HEADER_MINSIZE Tff7b72= T79c0ff2Tff7b72+T79c0ff1Tff7b72+Tb4b4b4(Te6edf3TRUNCATED_HASHLENGTHTff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff1Tb4b4b4; T8b949e// In bytes
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3HEADER_MAXSIZE Tff7b72= T79c0ff2Tff7b72+T79c0ff1Tff7b72+Tb4b4b4(Te6edf3TRUNCATED_HASHLENGTHTff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2Tb4b4b4; T8b949e// In bytes
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3IFAC_MIN_SIZE Tff7b72= T79c0ff1Tb4b4b4;
T8b949e//z IFAC_SALT = bytes.fromhex("adf54d882c9a9b80771eb4995d702d4a3e733391b2a0f53f416d9f907e55cff8")

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3MDU Tff7b72= Te6edf3MTU Tff7b72- Te6edf3HEADER_MAXSIZE Tff7b72- Te6edf3IFAC_MIN_SIZETb4b4b4;

Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3RESOURCE_CACHE Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24Tb4b4b4;
T8b949e// CBA TEST
T8b949e//static const uint16_t JOB_INTERVAL = 60*5;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3JOB_INTERVAL Tff7b72= T79c0ff60Tb4b4b4;
T8b949e// CBA TEST
T8b949e//static const uint16_t CLEAN_INTERVAL = 60*15;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3CLEAN_INTERVAL Tff7b72= T79c0ff60Tb4b4b4;
T8b949e// CBA MCU
T8b949e//static const uint16_t PERSIST_INTERVAL = 60*60*12;
T8b949e// CBA TEST
T8b949e//static const uint16_t PERSIST_INTERVAL = 60*60;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3PERSIST_INTERVAL Tff7b72= T79c0ff60Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3GRACIOUS_PERSIST_INTERVAL Tff7b72= T79c0ff60Tff7b72*T79c0ff5Tb4b4b4;

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3DESTINATION_LENGTH Tff7b72= Te6edf3TRUNCATED_HASHLENGTHTff7b72/T79c0ff8Tb4b4b4; T8b949e// In bytes

T8b949e// CBA MCU
T8b949e//static const uint8_t FILEPATH_MAXSIZE = 64;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3FILEPATH_MAXSIZE Tff7b72= T79c0ff96Tb4b4b4;

Tb4b4b4}

Te6edf3namespace Te6edf3Identity Tb4b4b4{

T8b949e// The curve used for Elliptic Curve DH key exchanges
T8b949e//static const char CURVE[] = "Curve25519";
Tff7b72static Tff7b72constexpr Tff7b72const Tffa657charTff7b72* Te6edf3CURVE Tff7b72= Ta5d6ff"Ta5d6ffCurve25519Ta5d6ff"Tb4b4b4;

T8b949e// X25519 key size in bits. A complete key is the concatenation of a 256 bit encryption key, and a 256 bit signing key.
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3KEYSIZE Tff7b72= T79c0ff256Tff7b72*T79c0ff2Tb4b4b4;

T8b949e// X.25519 ratchet key size in bits.
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3RATCHETSIZE Tff7b72= T79c0ff256Tb4b4b4;

T8b949e/*
The expiry time for received ratchets in seconds, defaults to 30 days. Reticulum will always use the most recently
announced ratchet, and remember it for up to ``RATCHET_EXPIRY`` since receiving it, after which it will be discarded.
If a newer ratchet is announced in the meantime, it will be replace the already known ratchet.
*/
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3RATCHET_EXPIRY Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24Tff7b72*T79c0ff30Tb4b4b4;

T8b949e// Non-configurable constants
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3FERNET_OVERHEAD Tff7b72= Te6edf3CryptographyTff7b72:Tff7b72:Te6edf3FernetTff7b72:Tff7b72:Te6edf3FERNET_OVERHEADTb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3TOKEN_OVERHEAD Tff7b72= Te6edf3CryptographyTff7b72:Tff7b72:Te6edf3TokenTff7b72:Tff7b72:Te6edf3TOKEN_OVERHEADTb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3AES128_BLOCKSIZE Tff7b72= T79c0ff16Tb4b4b4; T8b949e// In bytes
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3HASHLENGTH Tff7b72= Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3HASHLENGTHTb4b4b4; T8b949e// In bits
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3SIGLENGTH Tff7b72= Te6edf3KEYSIZETb4b4b4; T8b949e// In bits

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3NAME_HASH_LENGTH Tff7b72= T79c0ff80Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3RANDOM_HASH_LENGTH Tff7b72= T79c0ff80Tb4b4b4;
T8b949e// Constant specifying the truncated hash length (in bits) used by Reticulum
T8b949e// for addressable hashes and other purposes. Non-configurable.
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3TRUNCATED_HASHLENGTH Tff7b72= Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3TRUNCATED_HASHLENGTHTb4b4b4; T8b949e// In bits

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3DERIVED_KEY_LENGTH Tff7b72= T79c0ff512Tff7b72/T79c0ff8Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3DERIVED_KEY_LENGTH_LEGACY Tff7b72= T79c0ff256Tff7b72/T79c0ff8Tb4b4b4;

Tb4b4b4}

Te6edf3namespace Te6edf3Destination Tb4b4b4{

Tff7b72enum Te6edf3types Tb4b4b4{
Te6edf3SINGLE Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3GROUP Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3PLAIN Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3LINK Tff7b72= T79c0ff0x03Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3proof_strategies Tb4b4b4{
Te6edf3PROVE_NONE Tff7b72= T79c0ff0x21Tb4b4b4,
Te6edf3PROVE_APP Tff7b72= T79c0ff0x22Tb4b4b4,
Te6edf3PROVE_ALL Tff7b72= T79c0ff0x23Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3request_policies Tb4b4b4{
Te6edf3ALLOW_NONE Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3ALLOW_ALL Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3ALLOW_LIST Tff7b72= T79c0ff0x02Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3directions Tb4b4b4{
Te6edf3IN Tff7b72= T79c0ff0x11Tb4b4b4,
Te6edf3OUT Tff7b72= T79c0ff0x12Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72const Tffa657uint8_t Te6edf3PR_TAG_WINDOW Tff7b72= T79c0ff30Tb4b4b4;

Tb4b4b4}

Te6edf3namespace Te6edf3Link Tb4b4b4{

T8b949e// The curve used for Elliptic Curve DH key exchanges
Tff7b72static Tff7b72constexpr Tff7b72const Tffa657charTff7b72* Te6edf3CURVE Tff7b72= Te6edf3IdentityTff7b72:Tff7b72:Te6edf3CURVETb4b4b4;

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3ECPUBSIZE Tff7b72= T79c0ff32Tff7b72+T79c0ff32Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3KEYSIZE Tff7b72= T79c0ff32Tb4b4b4;

T8b949e//static const uint16_t MDU = floor((Reticulum::MTU-Reticulum::IFAC_MIN_SIZE-Reticulum::HEADER_MINSIZE-Identity::FERNET_OVERHEAD)/Identity::AES128_BLOCKSIZE)*Identity::AES128_BLOCKSIZE - 1;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3MDU Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3MTUTff7b72-Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3IFAC_MIN_SIZETff7b72-Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3HEADER_MINSIZETff7b72-Te6edf3IdentityTff7b72:Tff7b72:Te6edf3FERNET_OVERHEADTb4b4b4)Tff7b72/Te6edf3IdentityTff7b72:Tff7b72:Te6edf3AES128_BLOCKSIZETb4b4b4)Tff7b72*Te6edf3IdentityTff7b72:Tff7b72:Te6edf3AES128_BLOCKSIZE Tff7b72- T79c0ff1Tb4b4b4;

T8b949e// Timeout for link establishment in seconds per hop to destination.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3ESTABLISHMENT_TIMEOUT_PER_HOP Tff7b72= Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3DEFAULT_PER_HOP_TIMEOUTTb4b4b4;

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3LINK_MTU_SIZE Tff7b72= T79c0ff3Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3TRAFFIC_TIMEOUT_MIN_MS Tff7b72= T79c0ff5Tb4b4b4;
T8b949e// RTT timeout factor used in link timeout calculation.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3TRAFFIC_TIMEOUT_FACTOR Tff7b72= T79c0ff6Tb4b4b4;
Tff7b72static Tff7b72const Tffa657float Te6edf3KEEPALIVE_MAX_RTT Tff7b72= T79c0ff1.75Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3KEEPALIVE_TIMEOUT_FACTOR Tff7b72= T79c0ff4Tb4b4b4;
T8b949e// Grace period in seconds used in link timeout calculation.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3STALE_GRACE Tff7b72= T79c0ff2Tb4b4b4;
T8b949e// Interval for sending keep-alive packets on established links in seconds.
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3KEEPALIVE Tff7b72= T79c0ff360Tb4b4b4;
T8b949e/*
If no traffic or keep-alive packets are received within this period, the
link will be marked as stale, and a final keep-alive packet will be sent.
If after this no traffic or keep-alive packets are received within ``RTT`` *
``KEEPALIVE_TIMEOUT_FACTOR`` + ``STALE_GRACE``, the link is considered timed out,
and will be torn down.
*/
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3STALE_FACTOR Tff7b72= T79c0ff2Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3STALE_TIME Tff7b72= T79c0ff2Tff7b72*Te6edf3KEEPALIVETb4b4b4;

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WATCHDOG_MAX_SLEEP Tff7b72= T79c0ff5Tb4b4b4;

Tff7b72static Tff7b72const Tffa657uint64_t Te6edf3MTU_BYTEMASK Tff7b72= T79c0ff0x1FFFFFTb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3MODE_BYTEMASK Tff7b72= T79c0ff0xE0Tb4b4b4;

Tff7b72enum Te6edf3status Tb4b4b4{
Te6edf3PENDING Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3HANDSHAKE Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3ACTIVE Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3STALE Tff7b72= T79c0ff0x03Tb4b4b4,
Te6edf3CLOSED Tff7b72= T79c0ff0x04
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3teardown_reason Tb4b4b4{
Te6edf3TEARDOWN_NONE Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3TIMEOUT Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3INITIATOR_CLOSED Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3DESTINATION_CLOSED Tff7b72= T79c0ff0x03Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3resource_strategy Tb4b4b4{
Te6edf3ACCEPT_NONE Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3ACCEPT_APP Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3ACCEPT_ALL Tff7b72= T79c0ff0x02Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3link_mode Tb4b4b4{
Te6edf3MODE_AES128_CBC Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3MODE_AES256_CBC Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3MODE_AES256_GCM Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3MODE_OTP_RESERVED Tff7b72= T79c0ff0x03Tb4b4b4,
Te6edf3MODE_PQ_RESERVED_1 Tff7b72= T79c0ff0x04Tb4b4b4,
Te6edf3MODE_PQ_RESERVED_2 Tff7b72= T79c0ff0x05Tb4b4b4,
Te6edf3MODE_PQ_RESERVED_3 Tff7b72= T79c0ff0x06Tb4b4b4,
Te6edf3MODE_PQ_RESERVED_4 Tff7b72= T79c0ff0x07Tb4b4b4,
Tb4b4b4}Tb4b4b4;

T8b949e/*
MODE_DESCRIPTIONS = {MODE_AES128_CBC: "AES_128_CBC",
MODE_AES256_CBC: "AES_256_CBC",
MODE_AES256_GCM: "MODE_AES256_GCM",
MODE_OTP_RESERVED: "MODE_OTP_RESERVED",
MODE_PQ_RESERVED_1: "MODE_PQ_RESERVED_1",
MODE_PQ_RESERVED_2: "MODE_PQ_RESERVED_2",
MODE_PQ_RESERVED_3: "MODE_PQ_RESERVED_3",
MODE_PQ_RESERVED_4: "MODE_PQ_RESERVED_4"}
*/

Tb4b4b4}

Te6edf3namespace Te6edf3RequestReceipt Tb4b4b4{

Tff7b72enum Te6edf3status Tb4b4b4{
Te6edf3FAILED Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3SENT Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3DELIVERED Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3RECEIVING Tff7b72= T79c0ff0x03Tb4b4b4,
Te6edf3READY Tff7b72= T79c0ff0x04Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tb4b4b4}

Te6edf3namespace Te6edf3Interface Tb4b4b4{

T8b949e// Interface mode definitions
Tff7b72enum Te6edf3modes Tb4b4b4{
Te6edf3MODE_NONE Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3MODE_FULL Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3MODE_POINT_TO_POINT Tff7b72= T79c0ff0x04Tb4b4b4,
Te6edf3MODE_ACCESS_POINT Tff7b72= T79c0ff0x08Tb4b4b4,
Te6edf3MODE_ROAMING Tff7b72= T79c0ff0x10Tb4b4b4,
Te6edf3MODE_BOUNDARY Tff7b72= T79c0ff0x20Tb4b4b4,
Te6edf3MODE_GATEWAY Tff7b72= T79c0ff0x40Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tb4b4b4}

Te6edf3namespace Te6edf3Packet Tb4b4b4{

T8b949e// Packet types
Tff7b72enum Te6edf3types Tb4b4b4{
Te6edf3DATA Tff7b72= T79c0ff0x00Tb4b4b4, T8b949e// Data packets
Te6edf3ANNOUNCE Tff7b72= T79c0ff0x01Tb4b4b4, T8b949e// Announces
Te6edf3LINKREQUEST Tff7b72= T79c0ff0x02Tb4b4b4, T8b949e// Link requests
Te6edf3PROOF Tff7b72= T79c0ff0x03Tb4b4b4, T8b949e// Proofs
Tb4b4b4}Tb4b4b4;

T8b949e// Header types
Tff7b72enum Te6edf3header_types Tb4b4b4{
Te6edf3HEADER_1 Tff7b72= T79c0ff0x00Tb4b4b4, T8b949e// Normal header format
Te6edf3HEADER_2 Tff7b72= T79c0ff0x01Tb4b4b4, T8b949e// Header format used for packets in transport
Tb4b4b4}Tb4b4b4;

T8b949e// Packet context types
Tff7b72enum Te6edf3context_types Tb4b4b4{
Te6edf3CONTEXT_NONE Tff7b72= T79c0ff0x00Tb4b4b4, T8b949e// Generic data packet
Te6edf3RESOURCE Tff7b72= T79c0ff0x01Tb4b4b4, T8b949e// Packet is part of a resource
Te6edf3RESOURCE_ADV Tff7b72= T79c0ff0x02Tb4b4b4, T8b949e// Packet is a resource advertisement
Te6edf3RESOURCE_REQ Tff7b72= T79c0ff0x03Tb4b4b4, T8b949e// Packet is a resource part request
Te6edf3RESOURCE_HMU Tff7b72= T79c0ff0x04Tb4b4b4, T8b949e// Packet is a resource hashmap update
Te6edf3RESOURCE_PRF Tff7b72= T79c0ff0x05Tb4b4b4, T8b949e// Packet is a resource proof
Te6edf3RESOURCE_ICL Tff7b72= T79c0ff0x06Tb4b4b4, T8b949e// Packet is a resource initiator cancel message
Te6edf3RESOURCE_RCL Tff7b72= T79c0ff0x07Tb4b4b4, T8b949e// Packet is a resource receiver cancel message
Te6edf3CACHE_REQUEST Tff7b72= T79c0ff0x08Tb4b4b4, T8b949e// Packet is a cache request
Te6edf3REQUEST Tff7b72= T79c0ff0x09Tb4b4b4, T8b949e// Packet is a request
Te6edf3RESPONSE Tff7b72= T79c0ff0x0ATb4b4b4, T8b949e// Packet is a response to a request
Te6edf3PATH_RESPONSE Tff7b72= T79c0ff0x0BTb4b4b4, T8b949e// Packet is a response to a path request
Te6edf3COMMAND Tff7b72= T79c0ff0x0CTb4b4b4, T8b949e// Packet is a command
Te6edf3COMMAND_STATUS Tff7b72= T79c0ff0x0DTb4b4b4, T8b949e// Packet is a status of an executed command
Te6edf3CHANNEL Tff7b72= T79c0ff0x0ETb4b4b4, T8b949e// Packet contains link channel data
Te6edf3KEEPALIVE Tff7b72= T79c0ff0xFATb4b4b4, T8b949e// Packet is a keepalive packet
Te6edf3LINKIDENTIFY Tff7b72= T79c0ff0xFBTb4b4b4, T8b949e// Packet is a link peer identification proof
Te6edf3LINKCLOSE Tff7b72= T79c0ff0xFCTb4b4b4, T8b949e// Packet is a link close message
Te6edf3LINKPROOF Tff7b72= T79c0ff0xFDTb4b4b4, T8b949e// Packet is a link packet proof
Te6edf3LRRTT Tff7b72= T79c0ff0xFETb4b4b4, T8b949e// Packet is a link request round-trip time measurement
Te6edf3LRPROOF Tff7b72= T79c0ff0xFFTb4b4b4, T8b949e// Packet is a link request proof
Tb4b4b4}Tb4b4b4;

T8b949e// Context flag values
Tff7b72enum Te6edf3context_flags Tb4b4b4{
Te6edf3FLAG_SET Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3FLAG_UNSET Tff7b72= T79c0ff0x00Tb4b4b4,
Tb4b4b4}Tb4b4b4;

T8b949e// This is used to calculate allowable
T8b949e// payload sizes
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3HEADER_MAXSIZE Tff7b72= Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3HEADER_MAXSIZETb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3MDU Tff7b72= Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3MDUTb4b4b4;

T8b949e// With an MTU of 500, the maximum of data we can
T8b949e// send in a single encrypted packet is given by
T8b949e// the below calculation; 383 bytes.
T8b949e//static const uint16_t ENCRYPTED_MDU = floor((Reticulum::MDU-Identity::FERNET_OVERHEAD-Identity::KEYSIZE/16)/Identity::AES128_BLOCKSIZE)*Identity::AES128_BLOCKSIZE - 1;
T8b949e//static const uint16_t ENCRYPTED_MDU;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3ENCRYPTED_MDU Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3MDUTff7b72-Te6edf3IdentityTff7b72:Tff7b72:Te6edf3FERNET_OVERHEADTff7b72-Te6edf3IdentityTff7b72:Tff7b72:Te6edf3KEYSIZETff7b72/T79c0ff16Tb4b4b4)Tff7b72/Te6edf3IdentityTff7b72:Tff7b72:Te6edf3AES128_BLOCKSIZETb4b4b4)Tff7b72*Te6edf3IdentityTff7b72:Tff7b72:Te6edf3AES128_BLOCKSIZE Tff7b72- T79c0ff1Tb4b4b4;
T8b949e// The maximum size of the payload data in a single encrypted packet
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3PLAIN_MDU Tff7b72= Te6edf3MDUTb4b4b4;
T8b949e// The maximum size of the payload data in a single unencrypted packet

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3TIMEOUT_PER_HOP Tff7b72= Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3DEFAULT_PER_HOP_TIMEOUTTb4b4b4;

Tb4b4b4}

Te6edf3namespace Te6edf3PacketReceipt Tb4b4b4{

T8b949e// Receipt status constants
Tff7b72enum Te6edf3Status Tb4b4b4{
Te6edf3FAILED Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3SENT Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3DELIVERED Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3CULLED Tff7b72= T79c0ff0xFF
Tb4b4b4}Tb4b4b4;

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3EXPL_LENGTH Tff7b72= Te6edf3IdentityTff7b72:Tff7b72:Te6edf3HASHLENGTH Tff7b72/ T79c0ff8 Tff7b72+ Te6edf3IdentityTff7b72:Tff7b72:Te6edf3SIGLENGTH Tff7b72/ T79c0ff8Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3IMPL_LENGTH Tff7b72= Te6edf3IdentityTff7b72:Tff7b72:Te6edf3SIGLENGTH Tff7b72/ T79c0ff8Tb4b4b4;

Tb4b4b4}

Te6edf3namespace Te6edf3Transport Tb4b4b4{

Tff7b72enum Te6edf3types Tb4b4b4{
Te6edf3BROADCAST Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3TRANSPORT Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3RELAY Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3TUNNEL Tff7b72= T79c0ff0x03Tb4b4b4,
Te6edf3NONE Tff7b72= T79c0ff0xFFTb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3reachabilities Tb4b4b4{
Te6edf3REACHABILITY_UNREACHABLE Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3REACHABILITY_DIRECT Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3REACHABILITY_TRANSPORT Tff7b72= T79c0ff0x02Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72enum Te6edf3state Tb4b4b4{
Te6edf3STATE_UNKNOWN Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3STATE_UNRESPONSIVE Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3STATE_RESPONSIVE Tff7b72= T79c0ff0x02Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72static Tff7b72constexpr Tff7b72const Tffa657charTff7b72* Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"Tb4b4b4;

T8b949e// Maximum amount of hops that Reticulum will transport a packet.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PATHFINDER_M Tff7b72= T79c0ff128Tb4b4b4; T8b949e// Max hops

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PATHFINDER_R Tff7b72= T79c0ff1Tb4b4b4; T8b949e// Retransmit retries
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PATHFINDER_G Tff7b72= T79c0ff5Tb4b4b4; T8b949e// Retry grace period
Tff7b72static Tff7b72constexpr Tff7b72const Tffa657float Te6edf3PATHFINDER_RW Tff7b72= T79c0ff0.5Tb4b4b4; T8b949e// Random window for announce rebroadcast

T8b949e// TODO: Calculate an optimal number for this in
T8b949e// various situations
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3LOCAL_REBROADCASTS_MAX Tff7b72= T79c0ff2Tb4b4b4; T8b949e// How many local rebroadcasts of an announce is allowed

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PATH_REQUEST_TIMEOUT Tff7b72= T79c0ff15Tb4b4b4; T8b949e// Default timuout for client path requests in seconds
Tff7b72static Tff7b72constexpr Tff7b72const Tffa657float Te6edf3PATH_REQUEST_GRACE Tff7b72= T79c0ff0.35Tb4b4b4; T8b949e// Grace time before a path announcement is made, allows directly reachable peers to respond first
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PATH_REQUEST_RW Tff7b72= T79c0ff2Tb4b4b4; T8b949e// Path request random window
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PATH_REQUEST_MI Tff7b72= T79c0ff5Tb4b4b4; T8b949e// Minimum interval in seconds for automated path requests

Tff7b72static Tff7b72constexpr Tff7b72const Tffa657float Te6edf3LINK_TIMEOUT Tff7b72= Te6edf3LinkTff7b72:Tff7b72:Te6edf3STALE_TIME Tff7b72* T79c0ff1.25Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3REVERSE_TIMEOUT Tff7b72= T79c0ff30Tff7b72*T79c0ff60Tb4b4b4; T8b949e// Reverse table entries are removed after 30 minutes
T8b949e// CBA MCU
T8b949e//static const uint16_t MAX_RECEIPTS = 1024; // Maximum number of receipts to keep track of
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3MAX_RECEIPTS Tff7b72= T79c0ff20Tb4b4b4; T8b949e// Maximum number of receipts to keep track of
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3MAX_RATE_TIMESTAMPS Tff7b72= T79c0ff16Tb4b4b4; T8b949e// Maximum number of announce timestamps to keep per destination
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PERSIST_RANDOM_BLOBS Tff7b72= T79c0ff8Tb4b4b4; T8b949e// Maximum number of random blobs per destination to persist to disk (reduced for MCU memory)
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3MAX_RANDOM_BLOBS Tff7b72= T79c0ff16Tb4b4b4; T8b949e// Maximum number of random blobs per destination to keep in memory (reduced for MCU memory)

T8b949e// CBA MCU
T8b949e//static const uint32_t DESTINATION_TIMEOUT = 60*60*24*7; // Destination table entries are removed if unused for one week
T8b949e//static const uint32_t PATHFINDER_E = 60*60*24*7; // Path expiration of one week
T8b949e//static const uint32_t AP_PATH_TIME = 60*60*24; // Path expiration of one day for Access Point paths
T8b949e//static const uint32_t ROAMING_PATH_TIME = 60*60*6; // Path expiration of 6 hours for Roaming paths
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3DESTINATION_TIMEOUT Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24Tff7b72*T79c0ff1Tb4b4b4; T8b949e// Destination table entries are removed if unused for one day
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3PATHFINDER_E Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24Tff7b72*T79c0ff1Tb4b4b4; T8b949e// Path expiration of one day
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3AP_PATH_TIME Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff6Tb4b4b4; T8b949e// Path expiration of 6 hours for Access Point paths
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3ROAMING_PATH_TIME Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff1Tb4b4b4; T8b949e// Path expiration of 1 hour for Roaming paths

Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3LOCAL_CLIENT_CACHE_MAXSIZE Tff7b72= T79c0ff512Tb4b4b4;
Tb4b4b4}

Te6edf3namespace Te6edf3Resource Tb4b4b4{

T8b949e// The initial window size at beginning of transfer
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WINDOW Tff7b72= T79c0ff4Tb4b4b4;

T8b949e// Absolute minimum window size during transfer
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WINDOW_MIN Tff7b72= T79c0ff1Tb4b4b4;

T8b949e// The maximum window size for transfers on slow links
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WINDOW_MAX_SLOW Tff7b72= T79c0ff10Tb4b4b4;

T8b949e// The maximum window size for transfers on fast links
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WINDOW_MAX_FAST Tff7b72= T79c0ff75Tb4b4b4;
T8b949e// For calculating maps and guard segments, this
T8b949e// must be set to the global maximum window.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WINDOW_MAX Tff7b72= Te6edf3WINDOW_MAX_FASTTb4b4b4;
T8b949e// If the fast rate is sustained for this many request
T8b949e// rounds, the fast link window size will be allowed.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3FAST_RATE_THRESHOLD Tff7b72= Te6edf3WINDOW_MAX_SLOW Tff7b72- Te6edf3WINDOW Tff7b72- T79c0ff2Tb4b4b4;

T8b949e// If the RTT rate is higher than this value,
T8b949e// the max window size for fast links will be used.
T8b949e// The default is 50 Kbps (the value is stored in
T8b949e// bytes per second, hence the "/ 8").
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3RATE_FAST Tff7b72= Tb4b4b4(T79c0ff50Tff7b72*T79c0ff1000Tb4b4b4) Tff7b72/ T79c0ff8Tb4b4b4;

T8b949e// The minimum allowed flexibility of the window size.
T8b949e// The difference between window_max and window_min
T8b949e// will never be smaller than this value.
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WINDOW_FLEXIBILITY Tff7b72= T79c0ff4Tb4b4b4;

T8b949e// Number of bytes in a map hash
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3MAPHASH_LEN Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3SDU Tff7b72= Te6edf3PacketTff7b72:Tff7b72:Te6edf3MDUTb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3RANDOM_HASH_SIZE Tff7b72= T79c0ff4Tb4b4b4;

T8b949e// This is an indication of what the
T8b949e// maximum size a resource should be, if
T8b949e// it is to be handled within reasonable
T8b949e// time constraint, even on small systems.
Tff7b72#
T8b949e// A small system in this regard is
T8b949e// defined as a Raspberry Pi, which should
T8b949e// be able to compress, encrypt and hash-map
T8b949e// the resource in about 10 seconds.
Tff7b72#
T8b949e// This constant will be used when determining
T8b949e// how to sequence the sending of large resources.
Tff7b72#
T8b949e// Capped at 16777215 (0xFFFFFF) per segment to
T8b949e// fit in 3 bytes in resource advertisements.
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3MAX_EFFICIENT_SIZE Tff7b72= T79c0ff16 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024 Tff7b72- T79c0ff1Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3RESPONSE_MAX_GRACE_TIME Tff7b72= T79c0ff10Tb4b4b4;
T8b949e// The maximum size to auto-compress with
T8b949e// bz2 before sending.
Tff7b72static Tff7b72const Tffa657uint32_t Te6edf3AUTO_COMPRESS_MAX_SIZE Tff7b72= Te6edf3MAX_EFFICIENT_SIZETb4b4b4;

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PART_TIMEOUT_FACTOR Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PART_TIMEOUT_FACTOR_AFTER_RTT Tff7b72= T79c0ff2Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3MAX_RETRIES Tff7b72= T79c0ff8Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3MAX_ADV_RETRIES Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3SENDER_GRACE_TIME Tff7b72= T79c0ff10Tb4b4b4;
Tff7b72static Tff7b72const Tffa657float Te6edf3RETRY_GRACE_TIME Tff7b72= T79c0ff0.25Tb4b4b4;
Tff7b72static Tff7b72const Tffa657float Te6edf3PER_RETRY_DELAY Tff7b72= T79c0ff0.5Tb4b4b4;

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3WATCHDOG_MAX_SLEEP Tff7b72= T79c0ff1Tb4b4b4;

Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3HASHMAP_IS_NOT_EXHAUSTED Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3HASHMAP_IS_EXHAUSTED Tff7b72= T79c0ff0xFFTb4b4b4;

T8b949e// Status constants
Tff7b72enum Te6edf3status Tb4b4b4{
Te6edf3NONE Tff7b72= T79c0ff0x00Tb4b4b4,
Te6edf3QUEUED Tff7b72= T79c0ff0x01Tb4b4b4,
Te6edf3ADVERTISED Tff7b72= T79c0ff0x02Tb4b4b4,
Te6edf3TRANSFERRING Tff7b72= T79c0ff0x03Tb4b4b4,
Te6edf3AWAITING_PROOF Tff7b72= T79c0ff0x04Tb4b4b4,
Te6edf3ASSEMBLING Tff7b72= T79c0ff0x05Tb4b4b4,
Te6edf3COMPLETE Tff7b72= T79c0ff0x06Tb4b4b4,
Te6edf3FAILED Tff7b72= T79c0ff0x07Tb4b4b4,
Te6edf3CORRUPT Tff7b72= T79c0ff0x08
Tb4b4b4}Tb4b4b4;

Te6edf3namespace Te6edf3ResourceAdvertisement Tb4b4b4{
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3OVERHEAD Tff7b72= T79c0ff134Tb4b4b4;
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3HASHMAP_MAX_LEN Tff7b72= Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3LinkTff7b72:Tff7b72:Te6edf3MDUTff7b72-Te6edf3OVERHEADTb4b4b4)Tff7b72/Te6edf3ResourceTff7b72:Tff7b72:Te6edf3MAPHASH_LENTb4b4b4)Tb4b4b4;
T8b949e//static const uint16_t HASHMAP_MAX_LEN = ((Link::MDU-OVERHEAD)/Resource::MAPHASH_LEN);
Tff7b72static Tff7b72const Tffa657uint16_t Te6edf3COLLISION_GUARD_SIZE Tff7b72= T79c0ff2Tff7b72*Te6edf3ResourceTff7b72:Tff7b72:Te6edf3WINDOW_MAXTff7b72+Te6edf3HASHMAP_MAX_LENTb4b4b4;

T8b949e//assert HASHMAP_MAX_LEN > 0, "The configured MTU is too small to include any map hashes in resource advertisments"
Tb4b4b4}

Tb4b4b4}

Te6edf3namespace Te6edf3Channel Tb4b4b4{
Tb4b4b4}

Tb4b4b4} Tb4b4b4}

Served by rngit 1.4.2 - Generated in 0.06s